<?php
/**
 * Генератор
 * 
 * Класс  содержит служебные функции, связанные с различной генерацией (в частности с генерацией паролей)
 * 
 * @author Дмитрий Кузьма <kouzma.d@gmail.com>
 * @version 1.0
 */
class Service_Generate {
  
  
  public function __construct() {//Конструктор
  }

  /**
   * Генерирует и возвращает слово необходимой длины (английский+цифры)
   *
   * @param integer $num
   * @return string
   */
  public static function generateWord($num) {
  	$retString ='';
  	for ($i = 0; $i < $num; $i++) 
  	  $retString .= self::generateChar();
  	return $retString;
  }
  /**
   * генерирует и возвращает  символ (английский+цифры)
   *
   * @return string
   */
  public static function generateChar() {
    $simbolNum = rand(1,62);
    if ($simbolNum <= 10)       //48-57=10 - цифры
      $simbolNum += 47;   
    else if ($simbolNum <= 36)  //65-90=26 - большие буквы
      $simbolNum += 54;
    else                       //97-122=26 - маленькие буквы
      $simbolNum += 60;      
    return chr($simbolNum);      
  }
  
  /**
   * генерирует и возвращает маленькую английскую букву
   *
   * @return string
   */
  public static function generateSmallLetter() {
    return chr(rand(97,122)); 
  }  
  
  /**
   * генерирует и возвращает маленькую английскую гласную
   *
   * @return string
   */
  public static function generateSmallVowel() {
    switch (rand(1,6)) {
	    case 1:
		    return "a";;
	    case 2:
		    return "e";;
		  case 3:
        return "i";
		  case 4:
        return "o";
      case 5:
		    return "u";	
      case 6:
		    return "y";
	    default:
	      return "";
    }
  }    
  
  /**
   * генерирует и возвращает маленькую английскую согласную
   *
   * @return string
   */
  public static function generateSmallConsonant() {
    $simbolNum = rand(97,122);
    switch ( $simbolNum ) {
	    case 97:
		    return self::generateSmallConsonant();
	    case 101:
		    return self::generateSmallConsonant();
		  case 105:
        return self::generateSmallConsonant();
		  case 111:
        return self::generateSmallConsonant();
      case 117:
		    return self::generateSmallConsonant();	
      case 121:
		    return self::generateSmallConsonant();
	    default:
	      return chr($simbolNum);
    }     
  }
  
  /**
   * генерирует и возвращает "Человеческий пароль"
   *
   * @return string
   */
  public static function generatePassword() {  
    $password = "";
    $numsNum = rand(1, 3);//Количество цифр в пароле
    for ( $i = 0; $i < $numsNum; $i++)
      $password .= chr(rand(48,57));
    if ($placeOfNumbers = rand(0,1))//определяем, в начале или конце будут расположены цифры
      $password .= self::generatePasswordLetters(8 - $numsNum);
    else 
      $password = self::generatePasswordLetters(8 - $numsNum) . $password;  
    return $password;  
  }

  /**
   * генерирует и возвращает буквенную часть "Человеческого пароля"
   *
   * @param integer $lettersNum - количество букв, содержащееся в пароле
   * @return string
   */
  public static function generatePasswordLetters($lettersNum) { 
    $text = "";
    $vowel = false;//Флаг того, какая буква (гласная/согласная)
    for ($i = 0; $i < $lettersNum; $i++)
    {
      if ($vowel)
        $text .= self::generateSmallVowel();  
      else
        $text .= self::generateSmallConsonant();  
      $vowel = !$vowel;
    }
    return $text;
  }
  public function __destruct() {//Деструктор
  }  

}